﻿/// <reference path="KingsSharp.js" />
(function () {
    KingsSharp.ObjtoObj = function (NewObject, OldObject) {
        function clonePrototype() { }
        clonePrototype.prototype = NewObject;
        var obj = new clonePrototype();
        for (var ele in obj) {
            if (typeof (obj[ele]) == "object")
                KingsSharp.ObjtoObj(obj[ele], OldObject[ele]);
            else
                OldObject[ele] = obj[ele];
        }
    };
    KingsSharp.Uploader = function (parameter) {
        var kitem = {
            startobj: "start",
            readmd5: true,
            readsize: 104857,
            readmd5type: "simple",
            read: false,
            readcall: null,
            readprocess: null,
            readload: null,
            readgreatsize: 83886080,
            checkmd5url:""
        };
        var item = {
            browse_button: "browse",
            url: "upload.php",
            chunk_size: "200kb",
            flash_swf_url: "Moxie.swf", //swf文件，当需要使用swf方式进行上传时需要配置该参数
            silverlight_xap_url: "Moxie.xap", //silverlight文件，当需要使用silverlight方式进行上传时需要配置该参数
            filters: {
                max_file_size: "6097mb", //最大只能上传400kb的文件
                prevent_duplicates: true //不允许选取重复文件
            },
            resize: {
                width: 200,
                height: 200,
                quality: 90,
                crop: true // crop to exact dimensions
            }
        }
        if (parameter.item) {
            KingsSharp.ObjtoObj(parameter.item, item);
        }
        if (parameter.kitem) {
            KingsSharp.ObjtoObj(parameter.kitem, kitem);
        }
        var uploader = new plupload.Uploader(item);
        uploader.init();
        uploader.bind('FilesAdded', function (uploader, files) {
            if (kitem.readmd5) {
                var spark = new SparkMD5();
                for (var i = 0; i < files.length; i++) {
                    var file = files[i];
                    if (window.FileReader || mOxie) {
                        var tofile = file.getNative() != null ? file.getNative() : file.getSource();
                        getFileMD5(tofile, function (md5value, f) {
                            if (kitem.readload) {
                                kitem.readload({ md5: md5value, file: f });
                            }
                        });
                    }
                    else {
                        if (kitem.readload) {
                            kitem.readload({ md5: "您的浏览器不支持HTML5", file: file });
                        }
                    }
                }
            }
        });
        var getFileSliceMD5 = function (start, end, file, callload, callprocess, i) {
            var blob, xhr, formData, useflash = false;

            if (window.FileReader || mOxie) {
                var reader, state;
                if (!window.FileReader) {
                    reader = new mOxie.FileReader();
                    state = mOxie.FileReader.DONE;
                    if (file.size > 83886080) {
                        useflash = true;
                    }
                }
                else {
                    reader = new FileReader();
                    state = FileReader.DONE;
                }
                if (!useflash) {
                    reader.onload = function (e) {
                        if (this.readyState == state) {
                            callload(e, i);
                        }
                    };
                    if (file.slice) {
                        blob = file.slice(start, end, 'text/plain;charset=UTF-8');
                    }
                    else if (file.webkitSlice) {
                        blob = file.webkitSlice(start, end, 'text/plain;charset=UTF-8');
                    } else if (file.mozSlice) {
                        blob = file.mozSlice(start, end, 'text/plain;charset=UTF-8');
                    }
                    reader.onprogress = function (e) {
                        callprocess(e, i);
                    }
                    reader.onerror = function (e) {
                        document.getElementById("xxx").value += JSON.stringify(e);
                    }
                    reader.readAsBinaryString(blob);
                }
                else {
                    if (file.slice) {
                        blob = file.slice(start, end, 'text/plain;charset=UTF-8');
                    }
                    else if (file.webkitSlice) {
                        blob = file.webkitSlice(start, end, 'text/plain;charset=UTF-8');
                    } else if (file.mozSlice) {
                        blob = file.mozSlice(start, end, 'text/plain;charset=UTF-8');
                    }
                    xhr = new o.XMLHttpRequest();

                    xhr.onload = function () {
                        var a = 1;
                        alert(xhr.responseText);
                    };
                    xhr.onerror = function () {
                        var a = 1;
                        alert(xhr.responseText);
                    };
                    xhr.open("post", kitem.checkmd5url, true);


                    formData = new o.FormData();


                    formData.append("kingsshapupload_checkmd5", "true");
                    // Add file and send it
                    formData.append(uploader.settings.file_data_name, blob);
                    xhr.send(formData, {
                        runtime_order: uploader.settings.runtimes,
                        required_caps: uploader.settings.required_features,
                        preferred_caps: {},
                        swf_url: uploader.settings.flash_swf_url,
                        xap_url: uploader.settings.silverlight_xap_url
                    });
                }
            }
            else {
                callload("您的浏览器不支持HTML5,Flash");
            }
        }
        var getFileMD5 = function (file, callback) {
            var spark = new SparkMD5();
            var start = 0, end = file.size > kitem.readsize ? kitem.readsize : file.size,
                   startMD5 = false, endMD5 = false,
                   chunks = Math.ceil(file.size / kitem.readsize),
                   laststart = 0, lastend = file.fize;

            if (kitem.readmd5type == "simple" && file.size > kitem.readsize) {
                var startMD5 = false, endMD5 = false;
                var arrsize = [];
                arrsize[0] = 0; arrsize[1] = 0;
                getFileSliceMD5(start, end, file, function (e) {
                    startMD5 = true;
                    spark.appendBinary(e.target.result);
                    if (startMD5 && endMD5) {
                        callback(spark.end(), file);
                    }
                }, function (e, i) {
                    arrsize[i] = e.loaded;
                    if (kitem.readprocess) {
                        kitem.readprocess({ loaded: arrsize[i], total: file.size, file: file });
                    }
                }, 0);
                laststart = (chunks - 1) * kitem.readsize;
                getFileSliceMD5(laststart, file.size, file, function (e) {
                    endMD5 = true;
                    spark.appendBinary(e.target.result);
                    if (startMD5 && endMD5) {
                        callback(spark.end(), file);
                    }
                }, function (e, i) {
                    arrsize[i] = e.loaded;
                    if (kitem.readprocess) {
                        kitem.readprocess({ loaded: arrsize[i], total: file.size, file: file });
                    }
                }, 1);
            }
            else {
                var length = 1;
                if (file.size > kitem.readsize) {
                    length = Math.ceil(Number(file.size) / Number(kitem.readsize));
                }
                var allsize = 0;
                var arrsize = [];
                for (var i = 0; i < length; i++) {
                    var readend = i + 1 == length ? file.size : i * kitem.readsize + kitem.readsize;
                    arrsize[i] = 0;
                    getFileSliceMD5(i * kitem.readsize, readend, file, function (e, y) {
                        var _readend = y + 1 == length ? file.size : y * kitem.readsize + kitem.readsize;
                        var _readsize = kitem.readsize;
                        if (y + 1 == length) {
                            _readsize = file.size % kitem.readsize;
                        }
                        allsize += _readsize;
                        spark.appendBinary(e.target.result);
                        if (allsize == file.size) {
                            callback(spark.end(), file);
                        }
                    }, function (p, x) {
                        arrsize[x] = p.loaded;
                        if (kitem.readprocess) {
                            kitem.readprocess({ loaded: eval(arrsize.join('+')), total: file.size, file: file });
                        }
                    }, i);
                }
            }
        };
        return uploader;
    };
})();

//--sprk-md5

(function (factory) { if (typeof exports === "object") { module.exports = factory() } else if (typeof define === "function" && define.amd) { define(factory) } else { var glob; try { glob = window } catch (e) { glob = self } glob.SparkMD5 = factory() } })(function (undefined) { "use strict"; var add32 = function (a, b) { return a + b & 4294967295 }, hex_chr = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"]; function cmn(q, a, b, x, s, t) { a = add32(add32(a, q), add32(x, t)); return add32(a << s | a >>> 32 - s, b) } function ff(a, b, c, d, x, s, t) { return cmn(b & c | ~b & d, a, b, x, s, t) } function gg(a, b, c, d, x, s, t) { return cmn(b & d | c & ~d, a, b, x, s, t) } function hh(a, b, c, d, x, s, t) { return cmn(b ^ c ^ d, a, b, x, s, t) } function ii(a, b, c, d, x, s, t) { return cmn(c ^ (b | ~d), a, b, x, s, t) } function md5cycle(x, k) { var a = x[0], b = x[1], c = x[2], d = x[3]; a = ff(a, b, c, d, k[0], 7, -680876936); d = ff(d, a, b, c, k[1], 12, -389564586); c = ff(c, d, a, b, k[2], 17, 606105819); b = ff(b, c, d, a, k[3], 22, -1044525330); a = ff(a, b, c, d, k[4], 7, -176418897); d = ff(d, a, b, c, k[5], 12, 1200080426); c = ff(c, d, a, b, k[6], 17, -1473231341); b = ff(b, c, d, a, k[7], 22, -45705983); a = ff(a, b, c, d, k[8], 7, 1770035416); d = ff(d, a, b, c, k[9], 12, -1958414417); c = ff(c, d, a, b, k[10], 17, -42063); b = ff(b, c, d, a, k[11], 22, -1990404162); a = ff(a, b, c, d, k[12], 7, 1804603682); d = ff(d, a, b, c, k[13], 12, -40341101); c = ff(c, d, a, b, k[14], 17, -1502002290); b = ff(b, c, d, a, k[15], 22, 1236535329); a = gg(a, b, c, d, k[1], 5, -165796510); d = gg(d, a, b, c, k[6], 9, -1069501632); c = gg(c, d, a, b, k[11], 14, 643717713); b = gg(b, c, d, a, k[0], 20, -373897302); a = gg(a, b, c, d, k[5], 5, -701558691); d = gg(d, a, b, c, k[10], 9, 38016083); c = gg(c, d, a, b, k[15], 14, -660478335); b = gg(b, c, d, a, k[4], 20, -405537848); a = gg(a, b, c, d, k[9], 5, 568446438); d = gg(d, a, b, c, k[14], 9, -1019803690); c = gg(c, d, a, b, k[3], 14, -187363961); b = gg(b, c, d, a, k[8], 20, 1163531501); a = gg(a, b, c, d, k[13], 5, -1444681467); d = gg(d, a, b, c, k[2], 9, -51403784); c = gg(c, d, a, b, k[7], 14, 1735328473); b = gg(b, c, d, a, k[12], 20, -1926607734); a = hh(a, b, c, d, k[5], 4, -378558); d = hh(d, a, b, c, k[8], 11, -2022574463); c = hh(c, d, a, b, k[11], 16, 1839030562); b = hh(b, c, d, a, k[14], 23, -35309556); a = hh(a, b, c, d, k[1], 4, -1530992060); d = hh(d, a, b, c, k[4], 11, 1272893353); c = hh(c, d, a, b, k[7], 16, -155497632); b = hh(b, c, d, a, k[10], 23, -1094730640); a = hh(a, b, c, d, k[13], 4, 681279174); d = hh(d, a, b, c, k[0], 11, -358537222); c = hh(c, d, a, b, k[3], 16, -722521979); b = hh(b, c, d, a, k[6], 23, 76029189); a = hh(a, b, c, d, k[9], 4, -640364487); d = hh(d, a, b, c, k[12], 11, -421815835); c = hh(c, d, a, b, k[15], 16, 530742520); b = hh(b, c, d, a, k[2], 23, -995338651); a = ii(a, b, c, d, k[0], 6, -198630844); d = ii(d, a, b, c, k[7], 10, 1126891415); c = ii(c, d, a, b, k[14], 15, -1416354905); b = ii(b, c, d, a, k[5], 21, -57434055); a = ii(a, b, c, d, k[12], 6, 1700485571); d = ii(d, a, b, c, k[3], 10, -1894986606); c = ii(c, d, a, b, k[10], 15, -1051523); b = ii(b, c, d, a, k[1], 21, -2054922799); a = ii(a, b, c, d, k[8], 6, 1873313359); d = ii(d, a, b, c, k[15], 10, -30611744); c = ii(c, d, a, b, k[6], 15, -1560198380); b = ii(b, c, d, a, k[13], 21, 1309151649); a = ii(a, b, c, d, k[4], 6, -145523070); d = ii(d, a, b, c, k[11], 10, -1120210379); c = ii(c, d, a, b, k[2], 15, 718787259); b = ii(b, c, d, a, k[9], 21, -343485551); x[0] = add32(a, x[0]); x[1] = add32(b, x[1]); x[2] = add32(c, x[2]); x[3] = add32(d, x[3]) } function md5blk(s) { var md5blks = [], i; for (i = 0; i < 64; i += 4) { md5blks[i >> 2] = s.charCodeAt(i) + (s.charCodeAt(i + 1) << 8) + (s.charCodeAt(i + 2) << 16) + (s.charCodeAt(i + 3) << 24) } return md5blks } function md5blk_array(a) { var md5blks = [], i; for (i = 0; i < 64; i += 4) { md5blks[i >> 2] = a[i] + (a[i + 1] << 8) + (a[i + 2] << 16) + (a[i + 3] << 24) } return md5blks } function md51(s) { var n = s.length, state = [1732584193, -271733879, -1732584194, 271733878], i, length, tail, tmp, lo, hi; for (i = 64; i <= n; i += 64) { md5cycle(state, md5blk(s.substring(i - 64, i))) } s = s.substring(i - 64); length = s.length; tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; for (i = 0; i < length; i += 1) { tail[i >> 2] |= s.charCodeAt(i) << (i % 4 << 3) } tail[i >> 2] |= 128 << (i % 4 << 3); if (i > 55) { md5cycle(state, tail); for (i = 0; i < 16; i += 1) { tail[i] = 0 } } tmp = n * 8; tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/); lo = parseInt(tmp[2], 16); hi = parseInt(tmp[1], 16) || 0; tail[14] = lo; tail[15] = hi; md5cycle(state, tail); return state } function md51_array(a) { var n = a.length, state = [1732584193, -271733879, -1732584194, 271733878], i, length, tail, tmp, lo, hi; for (i = 64; i <= n; i += 64) { md5cycle(state, md5blk_array(a.subarray(i - 64, i))) } a = i - 64 < n ? a.subarray(i - 64) : new Uint8Array(0); length = a.length; tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; for (i = 0; i < length; i += 1) { tail[i >> 2] |= a[i] << (i % 4 << 3) } tail[i >> 2] |= 128 << (i % 4 << 3); if (i > 55) { md5cycle(state, tail); for (i = 0; i < 16; i += 1) { tail[i] = 0 } } tmp = n * 8; tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/); lo = parseInt(tmp[2], 16); hi = parseInt(tmp[1], 16) || 0; tail[14] = lo; tail[15] = hi; md5cycle(state, tail); return state } function rhex(n) { var s = "", j; for (j = 0; j < 4; j += 1) { s += hex_chr[n >> j * 8 + 4 & 15] + hex_chr[n >> j * 8 & 15] } return s } function hex(x) { var i; for (i = 0; i < x.length; i += 1) { x[i] = rhex(x[i]) } return x.join("") } if (hex(md51("hello")) !== "5d41402abc4b2a76b9719d911017c592") { add32 = function (x, y) { var lsw = (x & 65535) + (y & 65535), msw = (x >> 16) + (y >> 16) + (lsw >> 16); return msw << 16 | lsw & 65535 } } function toUtf8(str) { if (/[\u0080-\uFFFF]/.test(str)) { str = unescape(encodeURIComponent(str)) } return str } function utf8Str2ArrayBuffer(str, returnUInt8Array) { var length = str.length, buff = new ArrayBuffer(length), arr = new Uint8Array(buff), i; for (i = 0; i < length; i++) { arr[i] = str.charCodeAt(i) } return returnUInt8Array ? arr : buff } function arrayBuffer2Utf8Str(buff) { return String.fromCharCode.apply(null, new Uint8Array(buff)) } function concatenateArrayBuffers(first, second, returnUInt8Array) { var result = new Uint8Array(first.byteLength + second.byteLength); result.set(new Uint8Array(first)); result.set(new Uint8Array(second), first.byteLength); return returnUInt8Array ? result : result.buffer } function SparkMD5() { this.reset() } SparkMD5.prototype.append = function (str) { this.appendBinary(toUtf8(str)); return this }; SparkMD5.prototype.appendBinary = function (contents) { this._buff += contents; this._length += contents.length; var length = this._buff.length, i; for (i = 64; i <= length; i += 64) { md5cycle(this._hash, md5blk(this._buff.substring(i - 64, i))) } this._buff = this._buff.substring(i - 64); return this }; SparkMD5.prototype.end = function (raw) { var buff = this._buff, length = buff.length, i, tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], ret; for (i = 0; i < length; i += 1) { tail[i >> 2] |= buff.charCodeAt(i) << (i % 4 << 3) } this._finish(tail, length); ret = !!raw ? this._hash : hex(this._hash); this.reset(); return ret }; SparkMD5.prototype.reset = function () { this._buff = ""; this._length = 0; this._hash = [1732584193, -271733879, -1732584194, 271733878]; return this }; SparkMD5.prototype.getState = function () { return { buff: this._buff, length: this._length, hash: this._hash} }; SparkMD5.prototype.setState = function (state) { this._buff = state.buff; this._length = state.length; this._hash = state.hash; return this }; SparkMD5.prototype.destroy = function () { delete this._hash; delete this._buff; delete this._length }; SparkMD5.prototype._finish = function (tail, length) { var i = length, tmp, lo, hi; tail[i >> 2] |= 128 << (i % 4 << 3); if (i > 55) { md5cycle(this._hash, tail); for (i = 0; i < 16; i += 1) { tail[i] = 0 } } tmp = this._length * 8; tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/); lo = parseInt(tmp[2], 16); hi = parseInt(tmp[1], 16) || 0; tail[14] = lo; tail[15] = hi; md5cycle(this._hash, tail) }; SparkMD5.hash = function (str, raw) { return SparkMD5.hashBinary(toUtf8(str), raw) }; SparkMD5.hashBinary = function (content, raw) { var hash = md51(content); return !!raw ? hash : hex(hash) }; SparkMD5.ArrayBuffer = function () { this.reset() }; SparkMD5.ArrayBuffer.prototype.append = function (arr) { var buff = concatenateArrayBuffers(this._buff.buffer, arr, true), length = buff.length, i; this._length += arr.byteLength; for (i = 64; i <= length; i += 64) { md5cycle(this._hash, md5blk_array(buff.subarray(i - 64, i))) } this._buff = i - 64 < length ? buff.subarray(i - 64) : new Uint8Array(0); return this }; SparkMD5.ArrayBuffer.prototype.end = function (raw) { var buff = this._buff, length = buff.length, tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], i, ret; for (i = 0; i < length; i += 1) { tail[i >> 2] |= buff[i] << (i % 4 << 3) } this._finish(tail, length); ret = !!raw ? this._hash : hex(this._hash); this.reset(); return ret }; SparkMD5.ArrayBuffer.prototype.reset = function () { this._buff = new Uint8Array(0); this._length = 0; this._hash = [1732584193, -271733879, -1732584194, 271733878]; return this }; SparkMD5.ArrayBuffer.prototype.getState = function () { var state = SparkMD5.prototype.getState.call(this); state.buff = arrayBuffer2Utf8Str(state.buff); return state }; SparkMD5.ArrayBuffer.prototype.setState = function (state) { state.buff = utf8Str2ArrayBuffer(state.buff, true); return SparkMD5.prototype.setState.call(this, state) }; SparkMD5.ArrayBuffer.prototype.destroy = SparkMD5.prototype.destroy; SparkMD5.ArrayBuffer.prototype._finish = SparkMD5.prototype._finish; SparkMD5.ArrayBuffer.hash = function (arr, raw) { var hash = md51_array(new Uint8Array(arr)); return !!raw ? hash : hex(hash) }; return SparkMD5 });
